import { withSSRContext } from "aws-amplify";
import { serializeModel, deserializeModel } from "@aws-amplify/datastore/ssr";
import { CoursesRouteLayout } from "../../../components/CoursesRouteLayout";
import { Contributor, Course, Lesson, Tag } from "../../../models";
import { capitalizeEnum, createCourseTitleUri } from "../../../utils";
import { useRouter } from "next/router";
import { Fallback } from "../../../components/Fallback";
import {
GetStaticPaths,
GetStaticPathsResult,
GetStaticPropsContext,
GetStaticPropsResult,
} from "next";
import {
CardLayoutData,
Context,
CoursePageParams,
CoursePageProps,
MetaInfo,
} from "../../../types/models";
import {
getCardLayoutData,
getCourseAndLessonData,
getCourseContributors,
getCourseTags,
} from "../../../lib/getData";
import { useState } from "react";
import {
Button,
Flex,
useBreakpointValue,
Image,
Text,
Card,
View,
} from "@aws-amplify/ui-react";
import { LessonLayout } from "../../../components/LessonLayout";
import { default as HeroLayout } from "../../../ui-components/HeroLayoutCustom";
import { LessonTableOfContents } from "../../../components/LessonTableOfContents";
import { YoutubeModal } from "../../../components/YoutubeModal";
import Link from "next/link";
import { LearnMarkdown } from "../../../components/LearnMarkdown";
export default function CoursePage(data: {
course: Course;
lessons: Lesson[];
tags: Tag[];
contributors: Contributor[];
cardLayoutData: string;
}) {
const router = useRouter();
const [modalIsOpen, setIsOpen] = useState(false);
function closeModal() {
setIsOpen(false);
}
const heroLayoutVariant = useBreakpointValue({
base: "mobile",
small: "mobile ",
medium: "default",
large: "default",
}) as "mobile" | "default";
if (router.isFallback) {
return ;
}
const course: Course = deserializeModel(Course, data.course);
const lessons: Lesson[] = deserializeModel(Lesson, data.lessons);
const tags: Tag[] = deserializeModel(Tag, data.tags);
const contributors: Contributor[] = deserializeModel(
Contributor,
data.contributors
);
const cardLayoutData: CardLayoutData[] = JSON.parse(data.cardLayoutData);
const buttonGroup = (
<>
Start course
>
);
// Course page meta data
const metaInfo: MetaInfo = {
title: course.title,
image: course.image,
description: course.description,
author: `${contributors
.map((c) => `${c.firstName} ${c.lastName}`)
.join(", ")}`,
};
return (
{buttonGroup}
SKILL LEVEL
{capitalizeEnum(course.skillLevel)}
TIME TO COMPLETE
{`${course.timeHours}${"h "}${
course.timeMinutes
}${"m"}`}
{course.trailerEmbedId && (
)}
{`What you'll learn`}
{course?.requirements && course.requirements.length > 0 && (
Requirements
{course.requirements.map((requirement, index) => {
return (
-
{requirement}
);
})}
)}
>
}
sidebarChildren={buttonGroup}
/>
);
}
export async function getStaticPaths(
context: GetStaticPaths & Context
): Promise> {
const { DataStore } = withSSRContext(context);
const courses: Course[] = await DataStore.query(Course, (c: any) =>
c.published("eq", true)
);
return {
paths: courses.map((course) => ({
params: {
courseurltitle: createCourseTitleUri(course.courseUrlTitle, course.id),
},
})),
fallback: false,
};
}
export async function getStaticProps(
context: GetStaticPropsContext & Context
): Promise> {
const courseAndLessonData = await getCourseAndLessonData(context);
if (courseAndLessonData) {
const courseTags = await getCourseTags(
context,
courseAndLessonData.course.id
);
const cardLayoutData = await getCardLayoutData(context);
const courseContributors = await getCourseContributors(
context,
(rel) => rel.course.id === courseAndLessonData.course.id
);
return {
props: {
course: serializeModel(courseAndLessonData.course),
lessons: serializeModel(courseAndLessonData.lessons),
tags: serializeModel(courseTags),
contributors: serializeModel(courseContributors),
cardLayoutData: JSON.stringify(cardLayoutData),
},
};
}
return {
notFound: true,
};
}